home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Hot Mix 17
/
Hot Mix 17.iso
/
HM17_SGI
/
research
/
lib
/
cond.pro
< prev
next >
Wrap
Text File
|
1997-07-08
|
3KB
|
80 lines
;$Id: cond.pro,v 1.11 1997/01/15 03:11:50 ali Exp $
;
; Copyright (c) 1994-1997, Research Systems, Inc. All rights reserved.
; Unauthorized reproduction prohibited.
;+
; NAME:
; COND
;
; PURPOSE:
; This function computes the condition number of an N by N array.
;
; CATEGORY:
; Complex Linear Algebra.
;
; CALLING SEQUENCE:
; Result = COND(A)
;
; INPUTS:
; A: An N by N real or complex array.
;
; KEYWORD PARAMETERS:
; DOUBLE: If set to a non-zero value, computations are done in
; double precision arithmetic.
;
; EXAMPLE:
; Define a complex array (a).
; a = [[complex(1, 0), complex(2,-2), complex(-3,1)], $
; [complex(1,-2), complex(2, 2), complex(1, 0)], $
; [complex(1, 1), complex(0, 1), complex(1, 5)]]
; Compute the condition number of the complex array (a) using
; double-precision complex arithmetic.
; result = cond(a, /double)
;
; PROCEDURE:
; This function returns the condition number of an N x N real or
; complex array (A) by explicitly computing, norm(A)*norm(A_inverse).
; If A is real and A_inverse is invalid (due to the singularity of A
; or floating-point errors in the nr_invert function), the condition
; number is returned as a -1. If A is complex and A_inverse is invalid
; (due to the singularity of A), calling COND.PRO results in floating-
; point errors.
;
; REFERENCE:
; ADVANCED ENGINEERING MATHEMATICS (seventh edition)
; Erwin Kreyszig
; ISBN 0-471-55380-8
;
; MODIFICATION HISTORY:
; Written by: GGS, RSI, April 1992
; Modified: GGS, RSI, February 1994
; Accepts complex inputs. Added DOUBLE keyword.
; Modified: GGS, RSI, November 1994
; Added support for double-precision complex inputs.
; Changed NR_INVERT to INVERT.
; Modified: GGS, RSI, April 1996
; Modified keyword checking and use of double precision.
;-
FUNCTION Cond, A, Double = Double
ON_ERROR, 2 ;Return to caller if error occurs.
Dimension = SIZE(A)
if Dimension[0] ne 2 then MESSAGE, $
"Input array must be two-dimensional."
if Dimension[1] ne Dimension[2] then MESSAGE, $
"Input array must be square."
if N_ELEMENTS(Double) eq 0 then $
Double = (Dimension[Dimension[0]+1] eq 5) or $
(Dimension[Dimension[0]+1] eq 9)
InverseA = INVERT(A, Status, Double = Double)
if Status eq 0 then RETURN, $ ;Valid inverse.
NORM(A, Double = Double) * NORM(InverseA, Double = Double) $
else RETURN, -1 ;Inversion failed.
END